import numpy as np
from sklearn.linear_model import Ridge
from sklearn.decomposition import PCA
from sklearn.linear_model import LinearRegression
from sklearn import preprocessing
import pandas as pd
from sklearn.cluster import KMeans
'''
任务如下：
1.读取data5.txt数据，其中第1-9列为自变量x，最后一列为因变量y
2.构建岭回归模型，并返回其自变量系数向量a1（数组）和截距(常数项)b1
3.对x进行主成分分析，并提取主成分，其中要求累计贡献在0.8以上
4.基于提取主成分，构建线性回归模型，返回其自变量系数向量a2（数组）和截距(常数项)b2
5.对x进行相关性分析，并返回相关系数矩阵r
6.读取data6.txt数据,进行zscore、minmax、maxabs、robust四种标准化，并返回标准化后的结果
  ，分别用zscore、minmax、maxabs和robust变量来表示
7.读取data7.txt数据，字段指定为'id', 'amount', 'income', 'datetime', 'age'，数据集记为df
8.对datetime数据离散化为星期值，对age数据离散化为0-40,40-80,>80三个区间段进行离散化，
   其中离散化后的数据覆盖原来的数据，datetime字段名称不变，age字段名称变为age2
9.对amount按0-200,200-1000,1000-5000,5000-10000四个区间段进行离散化和均值聚类离散化
   离散化后的数据字段记为amount1，amount2
10.对income按其平均值作为分界线，分为低压平均值和高于平均值两类进行离散化，分别用0和1来代替，
    离散化后的数据字段记为income1，
11.最终处理后的数据集df其字段依次为：
   id, amount, income, datetime, age2，amount1，amount2，income1
'''

# 读取数据
data = np.loadtxt('data5.txt', delimiter='\t')  # 读取数据文件
x,y = data[:, :-1],data[:, -1]  # 切分自变量和预测变量

# 使用岭回归算法进行回归分析
model_ridge = Ridge(alpha=1.0)  # 建立岭回归模型对象
model_ridge.fit(x, y)  # 输入x/y训练模型
a1=model_ridge.coef_ # 打印输出自变量的系数
b1=model_ridge.intercept_  # 打印输出截距

'''
# 使用主成分回归进行回归分析
model_pca = PCA()  # 建立PCA模型对象
data_pca = model_pca.fit_transform(x)  # 将x进行主成分分析
ratio_cumsm = np.cumsum(model_pca.explained_variance_ratio_)  # 得到所有主成分方差占比的累积数据
print(ratio_cumsm)  # 打印输出所有主成分方差占比累积
rule_index = np.where(ratio_cumsm > 0.8)  # 获取方差占比超过0.8的所有索引值
min_index = rule_index[0][0]  # 获取最小索引值
data_pca_result = data_pca[:, :min_index + 1]  # 根据最小索引值提取主成分
model_liner = LinearRegression()  # 建立回归模型对象
model_liner.fit(data_pca_result, y)  # 输入主成分数据和预测变量y并训练模型
print(model_liner.coef_)  # 打印输出自变量的系数
print(model_liner.intercept_)  # 打印输出截距
'''
pca=PCA(n_components=0.8) 
pca.fit(x)
data_pca_result=pca.transform(x)
model_liner = LinearRegression()  # 建立回归模型对象
model_liner.fit(data_pca_result, y)  # 输入主成分数据和预测变量y并训练模型
a2=model_liner.coef_  # 打印输出自变量的系数
b2=model_liner.intercept_  # 打印输出截距

r=np.corrcoef(x, rowvar=0)  # 相关性分析

data = np.loadtxt('data6.txt', delimiter='\t')  # 读取数据

zscore_scaler = preprocessing.StandardScaler()  # 建立StandardScaler对象
data_scale_1 = zscore_scaler.fit_transform(data)  # StandardScaler标准化处理

minmax_scaler = preprocessing.MinMaxScaler()  # 建立MinMaxScaler模型对象
data_scale_2 = minmax_scaler.fit_transform(data)  # MinMaxScaler标准化处理

maxabsscaler_scaler = preprocessing.MaxAbsScaler()  # 建立MaxAbsScaler对象
data_scale_3 = maxabsscaler_scaler.fit_transform(data)  # MaxAbsScaler标准化处理

robustscalerr_scaler = preprocessing.RobustScaler()  # 建立RobustScaler标准化对象
data_scale_4 = robustscalerr_scaler.fit_transform(data)  # RobustScaler标准化标准化处理

df = pd.read_table('data7.txt', names=['id', 'amount', 'income', 'datetime', 'age'])  #
dk= list(map(pd.to_datetime,df['datetime'])) # 将时间转换为datetime格式
df['datetime'] = list(map(pd.to_datetime,df['datetime'])) # 将时间转换为datetime格式
df['datetime'] = [i.weekday() for i in df['datetime']]# 离散化为周几

map_df = pd.DataFrame(
    [['0-10', '0-40'], ['10-20', '0-40'], ['20-30', '0-40'], ['30-40', '0-40'], ['40-50', '40-80'],
     ['50-60', '40-80'], ['60-70', '40-80'], ['70-80', '40-80'], ['80-90', '>80'], ['>90', '>80']],
    columns=['age', 'age2'])  # 定义一个要转换的新区间
df_tmp = df.merge(map_df, left_on='age', right_on='age', how='inner')  # 数据框关联匹配
df = df_tmp.drop('age', 1)  # 丢弃名为age的列

bins = [0, 200, 1000, 5000, 10000]  # 自定义区间边界
df['amount1'] = pd.cut(df['amount'], bins)  # 使用边界做离散化

data = df['amount']  # 获取要聚类的数据，名为amount的列
data_reshape = data.values.reshape((data.shape[0], 1))  # 转换数据形状
model_kmeans = KMeans(n_clusters=4, random_state=0)  # 创建KMeans模型并指定要聚类数量
keames_result = model_kmeans.fit_predict(data_reshape)  # 建模聚类
df['amount2'] = keames_result  # 新离散化的数据合并到原数据框

binarizer_scaler = preprocessing.Binarizer(threshold=df['income'].mean())  # 建立Binarizer模型对象
income_tmp = binarizer_scaler.fit_transform(df[['income']])  # Binarizer标准化转换
income_tmp.resize(df['income'].shape)  # 转换数据形状
df['income1'] = income_tmp  # Binarizer标准化转换
